Micron Document
🎖️GitЯра🎖️


Displaying Raw • Download

feature/node/src/main/kotlin/org/meshtastic/feature/node/metrics/DeviceMetrics.kt 78274c792318331b11ab64cd28e58e829875b8c2 (78274c79) Text, 18.10 KB

T8b949e/*
* Copyright (c) 2025 Meshtastic LLC
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/

Tff7b72package T7ee787org.meshtastic.feature.node.metrics

Tff7b72import T7ee787androidx.compose.foundation.Canvas
Tff7b72import T7ee787androidx.compose.foundation.horizontalScroll
Tff7b72import T7ee787androidx.compose.foundation.layout.Arrangement
Tff7b72import T7ee787androidx.compose.foundation.layout.Box
Tff7b72import T7ee787androidx.compose.foundation.layout.Column
Tff7b72import T7ee787androidx.compose.foundation.layout.Row
Tff7b72import T7ee787androidx.compose.foundation.layout.Spacer
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxHeight
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxSize
Tff7b72import T7ee787androidx.compose.foundation.layout.fillMaxWidth
Tff7b72import T7ee787androidx.compose.foundation.layout.height
Tff7b72import T7ee787androidx.compose.foundation.layout.padding
Tff7b72import T7ee787androidx.compose.foundation.layout.width
Tff7b72import T7ee787androidx.compose.foundation.lazy.LazyColumn
Tff7b72import T7ee787androidx.compose.foundation.lazy.items
Tff7b72import T7ee787androidx.compose.foundation.rememberScrollState
Tff7b72import T7ee787androidx.compose.foundation.text.selection.SelectionContainer
Tff7b72import T7ee787androidx.compose.material3.Card
Tff7b72import T7ee787androidx.compose.material3.MaterialTheme
Tff7b72import T7ee787androidx.compose.material3.Scaffold
Tff7b72import T7ee787androidx.compose.material3.Surface
Tff7b72import T7ee787androidx.compose.material3.Text
Tff7b72import T7ee787androidx.compose.runtime.Composable
Tff7b72import T7ee787androidx.compose.runtime.collectAsState
Tff7b72import T7ee787androidx.compose.runtime.getValue
Tff7b72import T7ee787androidx.compose.runtime.mutableStateOf
Tff7b72import T7ee787androidx.compose.runtime.remember
Tff7b72import T7ee787androidx.compose.runtime.setValue
Tff7b72import T7ee787androidx.compose.ui.Alignment
Tff7b72import T7ee787androidx.compose.ui.Modifier
Tff7b72import T7ee787androidx.compose.ui.graphics.Color
Tff7b72import T7ee787androidx.compose.ui.graphics.Path
Tff7b72import T7ee787androidx.compose.ui.graphics.StrokeCap
Tff7b72import T7ee787androidx.compose.ui.graphics.drawscope.Stroke
Tff7b72import T7ee787androidx.compose.ui.platform.LocalDensity
Tff7b72import T7ee787androidx.compose.ui.platform.LocalWindowInfo
Tff7b72import T7ee787androidx.compose.ui.text.TextStyle
Tff7b72import T7ee787androidx.compose.ui.text.font.FontWeight
Tff7b72import T7ee787androidx.compose.ui.tooling.preview.PreviewLightDark
Tff7b72import T7ee787androidx.compose.ui.unit.dp
Tff7b72import T7ee787androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
Tff7b72import T7ee787androidx.lifecycle.compose.collectAsStateWithLifecycle
Tff7b72import T7ee787org.jetbrains.compose.resources.stringResource
Tff7b72import T7ee787org.meshtastic.core.strings.Res
Tff7b72import T7ee787org.meshtastic.core.strings.air_util_definition
Tff7b72import T7ee787org.meshtastic.core.strings.air_utilization
Tff7b72import T7ee787org.meshtastic.core.strings.battery
Tff7b72import T7ee787org.meshtastic.core.strings.ch_util_definition
Tff7b72import T7ee787org.meshtastic.core.strings.channel_air_util
Tff7b72import T7ee787org.meshtastic.core.strings.channel_utilization
Tff7b72import T7ee787org.meshtastic.core.ui.component.MainAppBar
Tff7b72import T7ee787org.meshtastic.core.ui.component.MaterialBatteryInfo
Tff7b72import T7ee787org.meshtastic.core.ui.component.OptionLabel
Tff7b72import T7ee787org.meshtastic.core.ui.component.SlidingSelector
Tff7b72import T7ee787org.meshtastic.core.ui.theme.AppTheme
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Cyan
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Green
Tff7b72import T7ee787org.meshtastic.core.ui.theme.GraphColors.Magenta
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.DATE_TIME_FORMAT
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.MAX_PERCENT_VALUE
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.CommonCharts.MS_PER_SEC
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.GraphUtil.createPath
Tff7b72import T7ee787org.meshtastic.feature.node.metrics.GraphUtil.plotPoint
Tff7b72import T7ee787org.meshtastic.feature.node.model.TimeFrame
Tff7b72import T7ee787org.meshtastic.proto.TelemetryProtos
Tff7b72import T7ee787org.meshtastic.proto.TelemetryProtos.Telemetry

Tff7b72private Tff7b72const Tff7b72val Te6edf3CHART_WEIGHT Tff7b72= T79c0ff1f
Tff7b72private Tff7b72const Tff7b72val Te6edf3Y_AXIS_WEIGHT Tff7b72= T79c0ff0.1f
Tff7b72private Tff7b72const Tff7b72val Te6edf3CHART_WIDTH_RATIO Tff7b72= Te6edf3CHART_WEIGHT Tff7b72/ Tb4b4b4(Te6edf3CHART_WEIGHT Tff7b72+ Te6edf3Y_AXIS_WEIGHT Tff7b72+ Te6edf3Y_AXIS_WEIGHTTb4b4b4)

Tff7b72private Tff7b72enum Tff7b72class T56d364DeviceTb4b4b4(Tff7b72val Te6edf3colorTb4b4b4: Te6edf3ColorTb4b4b4) Tb4b4b4{
Te6edf3BATTERYTb4b4b4(Te6edf3GreenTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3batteryLevelTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Te6edf3CH_UTILTb4b4b4(Te6edf3MagentaTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3channelUtilization
Tb4b4b4}Tb4b4b4,
Te6edf3AIR_UTILTb4b4b4(Te6edf3CyanTb4b4b4) Tb4b4b4{
Tff7b72override Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3airUtilTx
Tb4b4b4}Tb4b4b4, Tb4b4b4;

Tff7b72abstract Tff7b72fun Td2a8ffgetValueTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4)Tb4b4b4: Tffa657Float
Tb4b4b4}

Tff7b72private Tff7b72val Te6edf3LEGEND_DATA Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3LegendDataTb4b4b4(Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3batteryTb4b4b4, Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3BATTERYTb4b4b4.Te6edf3colorTb4b4b4, Te6edf3isLine Tff7b72= Tff7b72trueTb4b4b4, Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3LegendDataTb4b4b4(
Te6edf3nameRes Tff7b72= Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3isLine Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3environmentMetric Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tf0883e@Composable
Tff7b72fun Td2a8ffDeviceMetricsScreenTb4b4b4(Te6edf3viewModelTb4b4b4: Te6edf3MetricsViewModel Tff7b72= Te6edf3hiltViewModelTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3onNavigateUpTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3state Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3stateTb4b4b4.Te6edf3collectAsStateWithLifecycleTb4b4b4(Tb4b4b4)
Tff7b72var Te6edf3displayInfoDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3selectedTimeFrame Tff7b72by Te6edf3viewModelTb4b4b4.Te6edf3timeFrameTb4b4b4.Te6edf3collectAsStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3data Tff7b72= Te6edf3stateTb4b4b4.Te6edf3deviceMetricsFilteredTb4b4b4(Te6edf3selectedTimeFrameTb4b4b4)

Te6edf3ScaffoldTb4b4b4(
Te6edf3topBar Tff7b72= Tb4b4b4{
Te6edf3MainAppBarTb4b4b4(
Te6edf3title Tff7b72= Te6edf3stateTb4b4b4.Te6edf3nodeTff7b72?.Te6edf3userTff7b72?.Te6edf3longName Tff7b72?: Ta5d6ff"Ta5d6ff"Tb4b4b4,
Te6edf3ourNode Tff7b72= Tff7b72nullTb4b4b4,
Te6edf3showNodeChip Tff7b72= Tff7b72falseTb4b4b4,
Te6edf3canNavigateUp Tff7b72= Tff7b72trueTb4b4b4,
Te6edf3onNavigateUp Tff7b72= Te6edf3onNavigateUpTb4b4b4,
Te6edf3actions Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Te6edf3onClickChip Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3innerPadding Tff7b72-Tff7b72>
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3innerPaddingTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72if Tb4b4b4(Te6edf3displayInfoDialogTb4b4b4) Tb4b4b4{
Te6edf3LegendInfoDialogTb4b4b4(
Te6edf3pairedRes Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3PairTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3ch_util_definitionTb4b4b4)Tb4b4b4,
Te6edf3PairTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_util_definitionTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Te6edf3fraction Tff7b72= T79c0ff0.33fTb4b4b4)Tb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3dataTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedTimeFrameTb4b4b4,
Te6edf3promptInfoDialog Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Te6edf3SlidingSelectorTb4b4b4(
Te6edf3TimeFrameTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3selectedTimeFrameTb4b4b4,
Te6edf3onOptionSelected Tff7b72= Tb4b4b4{ Te6edf3viewModelTb4b4b4.Te6edf3setTimeFrameTb4b4b4(Tffa657itTb4b4b4) Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3OptionLabelTb4b4b4(Te6edf3stringResourceTb4b4b4(Tffa657itTb4b4b4.Te6edf3strResTb4b4b4)Tb4b4b4)
Tb4b4b4}

T8b949e/* Device Metric Cards */
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{ Te6edf3itemsTb4b4b4(Te6edf3dataTb4b4b4) Tb4b4b4{ Te6edf3telemetry Tff7b72-Tff7b72> Te6edf3DeviceMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4) Tb4b4b4} Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffLongMethodTa5d6ff"Tb4b4b4)
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsChartTb4b4b4(
Te6edf3modifierTb4b4b4: Te6edf3Modifier Tff7b72= Te6edf3ModifierTb4b4b4,
Te6edf3telemetriesTb4b4b4: Te6edf3ListTff7b72<Te6edf3TelemetryTff7b72>Tb4b4b4,
Te6edf3selectedTimeTb4b4b4: Te6edf3TimeFrameTb4b4b4,
Te6edf3promptInfoDialogTb4b4b4: Tb4b4b4(Tb4b4b4) Tff7b72-Tff7b72> Tffa657UnitTb4b4b4,
Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3graphColor Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurface

Te6edf3ChartHeaderTb4b4b4(Te6edf3amount Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3sizeTb4b4b4)
Tff7b72if Tb4b4b4(Te6edf3telemetriesTb4b4b4.Te6edf3isEmptyTb4b4b4(Tb4b4b4)Tb4b4b4) Tff7b72return

Tff7b72val Tb4b4b4(Te6edf3oldestTb4b4b4, Te6edf3newestTb4b4b4) Tff7b72=
Te6edf3rememberTb4b4b4(Te6edf3key1 Tff7b72= Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3PairTb4b4b4(Te6edf3telemetriesTb4b4b4.Te6edf3minBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4, Te6edf3telemetriesTb4b4b4.Te6edf3maxBy Tb4b4b4{ Tffa657itTb4b4b4.Te6edf3time Tb4b4b4}Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3timeDiff Tff7b72= Te6edf3newestTb4b4b4.Te6edf3time Tff7b72- Te6edf3oldestTb4b4b4.Te6edf3time

Tff7b72val Te6edf3scrollState Tff7b72= Te6edf3rememberScrollStateTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3screenWidth Tff7b72= Te6edf3LocalWindowInfoTb4b4b4.Te6edf3currentTb4b4b4.Te6edf3containerSizeTb4b4b4.Te6edf3width
Tff7b72val Te6edf3dp Tff7b72by Te6edf3rememberTb4b4b4(Te6edf3key1 Tff7b72= Te6edf3selectedTimeTb4b4b4) Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Te6edf3selectedTimeTb4b4b4.Te6edf3dpTb4b4b4(Te6edf3screenWidthTb4b4b4, Te6edf3time Tff7b72= Te6edf3timeDiffTb4b4b4.Te6edf3toLongTb4b4b4(Tb4b4b4)Tb4b4b4)Tb4b4b4) Tb4b4b4}

T8b949e// Calculate visible time range based on scroll position and chart width
Tff7b72val Te6edf3visibleTimeRange Tff7b72= Te6edf3run Tb4b4b4{
Tff7b72val Te6edf3totalWidthPx Tff7b72= Te6edf3withTb4b4b4(Te6edf3LocalDensityTb4b4b4.Te6edf3currentTb4b4b4) Tb4b4b4{ Te6edf3dpTb4b4b4.Te6edf3toPxTb4b4b4(Tb4b4b4) Tb4b4b4}
Tff7b72val Te6edf3scrollPx Tff7b72= Te6edf3scrollStateTb4b4b4.Te6edf3valueTb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4)
T8b949e// Calculate visible width based on actual weight distribution
Tff7b72val Te6edf3visibleWidthPx Tff7b72= Te6edf3screenWidth Tff7b72* Te6edf3CHART_WIDTH_RATIO
Tff7b72val Te6edf3leftRatio Tff7b72= Tb4b4b4(Te6edf3scrollPx Tff7b72/ Te6edf3totalWidthPxTb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0fTb4b4b4, T79c0ff1fTb4b4b4)
Tff7b72val Te6edf3rightRatio Tff7b72= Tb4b4b4(Tb4b4b4(Te6edf3scrollPx Tff7b72+ Te6edf3visibleWidthPxTb4b4b4) Tff7b72/ Te6edf3totalWidthPxTb4b4b4)Tb4b4b4.Te6edf3coerceInTb4b4b4(T79c0ff0fTb4b4b4, T79c0ff1fTb4b4b4)
T8b949e// With reverseScrolling = true, scrolling right shows older data (left side of chart)
Tff7b72val Te6edf3visibleOldest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3time Tff7b72+ Tb4b4b4(Te6edf3timeDiff Tff7b72* Tb4b4b4(T79c0ff1f Tff7b72- Te6edf3rightRatioTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3visibleNewest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3time Tff7b72+ Tb4b4b4(Te6edf3timeDiff Tff7b72* Tb4b4b4(T79c0ff1f Tff7b72- Te6edf3leftRatioTb4b4b4)Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Te6edf3visibleOldest Te6edf3to Te6edf3visibleNewest
Tb4b4b4}

Te6edf3TimeLabelsTb4b4b4(Te6edf3oldest Tff7b72= Te6edf3visibleTimeRangeTb4b4b4.Te6edf3firstTb4b4b4, Te6edf3newest Tff7b72= Te6edf3visibleTimeRangeTb4b4b4.Te6edf3secondTb4b4b4)

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)

Te6edf3Row Tb4b4b4{
Te6edf3BoxTb4b4b4(
Te6edf3contentAlignment Tff7b72= Te6edf3AlignmentTb4b4b4.Te6edf3TopStartTb4b4b4,
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3horizontalScrollTb4b4b4(Te6edf3state Tff7b72= Te6edf3scrollStateTb4b4b4, Te6edf3reverseScrolling Tff7b72= Tff7b72trueTb4b4b4)Tb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= T79c0ff1fTb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{
T8b949e/*
* The order of the colors are with respect to the ChUtil.
* 25 - 49 Orange
* 50 - 100 Red
*/
Te6edf3HorizontalLinesOverlayTb4b4b4(
Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3lineColors Tff7b72= Te6edf3listOfTb4b4b4(Te6edf3graphColorTb4b4b4, Te6edf3ColorTb4b4b4.Te6edf3YellowTb4b4b4, Te6edf3ColorTb4b4b4.Te6edf3RedTb4b4b4, Te6edf3graphColorTb4b4b4, Te6edf3graphColorTb4b4b4)Tb4b4b4,
Tb4b4b4)

Te6edf3TimeAxisOverlayTb4b4b4(Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4, Te6edf3oldest Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3newest Tff7b72= Te6edf3newestTb4b4b4.Te6edf3timeTb4b4b4, Te6edf3selectedTimeTb4b4b4.Te6edf3lineIntervalTb4b4b4(Tb4b4b4)Tb4b4b4)

T8b949e/* Plot Battery Line, ChUtil, and AirUtilTx */
Te6edf3CanvasTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3widthTb4b4b4(Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3height Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3height
Tff7b72val Te6edf3width Tff7b72= Te6edf3sizeTb4b4b4.Te6edf3width
Tff7b72for Tb4b4b4(Te6edf3i Tff7b72in Te6edf3telemetriesTb4b4b4.Te6edf3indicesTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3telemetry Tff7b72= Te6edf3telemetriesTff7b72[Te6edf3iTff7b72]

T8b949e/* x-value time */
Tff7b72val Te6edf3xRatio Tff7b72= Tb4b4b4(Te6edf3telemetryTb4b4b4.Te6edf3time Tff7b72- Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4)Tb4b4b4.Te6edf3toFloatTb4b4b4(Tb4b4b4) Tff7b72/ Te6edf3timeDiff
Tff7b72val Te6edf3x Tff7b72= Te6edf3xRatio Tff7b72* Te6edf3width

T8b949e/* Channel Utilization */
Te6edf3plotPointTb4b4b4(
Te6edf3drawContext Tff7b72= Te6edf3drawContextTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3CH_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3x Tff7b72= Te6edf3xTb4b4b4,
Te6edf3value Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3channelUtilizationTb4b4b4,
Te6edf3divisor Tff7b72= Te6edf3MAX_PERCENT_VALUETb4b4b4,
Tb4b4b4)

T8b949e/* Air Utilization Transmit */
Te6edf3plotPointTb4b4b4(
Te6edf3drawContext Tff7b72= Te6edf3drawContextTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3AIR_UTILTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3x Tff7b72= Te6edf3xTb4b4b4,
Te6edf3value Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3airUtilTxTb4b4b4,
Te6edf3divisor Tff7b72= Te6edf3MAX_PERCENT_VALUETb4b4b4,
Tb4b4b4)
Tb4b4b4}

T8b949e/* Battery Line */
Tff7b72var Te6edf3index Tff7b72= T79c0ff0
Tff7b72while Tb4b4b4(Te6edf3index Tff7b72< Te6edf3telemetriesTb4b4b4.Te6edf3sizeTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3path Tff7b72= Te6edf3PathTb4b4b4(Tb4b4b4)
Te6edf3index Tff7b72=
Te6edf3createPathTb4b4b4(
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4,
Te6edf3index Tff7b72= Te6edf3indexTb4b4b4,
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3oldestTime Tff7b72= Te6edf3oldestTb4b4b4.Te6edf3timeTb4b4b4,
Te6edf3timeRange Tff7b72= Te6edf3timeDiffTb4b4b4,
Te6edf3width Tff7b72= Te6edf3widthTb4b4b4,
Te6edf3timeThreshold Tff7b72= Te6edf3selectedTimeTb4b4b4.Te6edf3timeThresholdTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Tff7b72val Te6edf3telemetry Tff7b72= Te6edf3telemetriesTb4b4b4.Te6edf3getOrNullTb4b4b4(Te6edf3iTb4b4b4) Tff7b72?: Te6edf3telemetriesTb4b4b4.Te6edf3lastTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3ratio Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetricsTb4b4b4.Te6edf3batteryLevel Tff7b72/ Te6edf3MAX_PERCENT_VALUE
Tff7b72val Te6edf3y Tff7b72= Te6edf3height Tff7b72- Tb4b4b4(Te6edf3ratio Tff7b72* Te6edf3heightTb4b4b4)
Tff7b72returnTf0883e@createPath Te6edf3y
Tb4b4b4}
Te6edf3drawPathTb4b4b4(
Te6edf3path Tff7b72= Te6edf3pathTb4b4b4,
Te6edf3color Tff7b72= Te6edf3DeviceTb4b4b4.Te6edf3BATTERYTb4b4b4.Te6edf3colorTb4b4b4,
Te6edf3style Tff7b72= Te6edf3StrokeTb4b4b4(Te6edf3width Tff7b72= Te6edf3GraphUtilTb4b4b4.Te6edf3RADIUSTb4b4b4, Te6edf3cap Tff7b72= Te6edf3StrokeCapTb4b4b4.Te6edf3RoundTb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Te6edf3YAxisLabelsTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3modifierTb4b4b4.Te6edf3weightTb4b4b4(Te6edf3weight Tff7b72= Te6edf3Y_AXIS_WEIGHTTb4b4b4)Tb4b4b4, Te6edf3graphColorTb4b4b4, Te6edf3minValue Tff7b72= T79c0ff0fTb4b4b4, Te6edf3maxValue Tff7b72= T79c0ff1T79c0ff0T79c0ff0fTb4b4b4)
Tb4b4b4}
Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)

Te6edf3LegendTb4b4b4(Te6edf3legendData Tff7b72= Te6edf3LEGEND_DATATb4b4b4, Te6edf3promptInfoDialog Tff7b72= Te6edf3promptInfoDialogTb4b4b4)

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff1T79c0ff6.Te6edf3dpTb4b4b4)Tb4b4b4)
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4) T8b949e// fake data
Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsChartPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetries Tff7b72=
Te6edf3ListTb4b4b4(T79c0ff2T79c0ff0Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Te6edf3TelemetryTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setTimeTb4b4b4(Te6edf3now Tff7b72- Tb4b4b4(T79c0ff1T79c0ff9 Tff7b72- Te6edf3iTb4b4b4) Tff7b72* T79c0ff6T79c0ff0 Tff7b72* T79c0ff6T79c0ff0Tb4b4b4) T8b949e// 1-hour intervals, oldest first
Tb4b4b4.Te6edf3setDeviceMetricsTb4b4b4(
Te6edf3TelemetryProtosTb4b4b4.Te6edf3DeviceMetricsTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setBatteryLevelTb4b4b4(T79c0ff8T79c0ff0 Tff7b72- Te6edf3iTb4b4b4)
Tb4b4b4.Te6edf3setVoltageTb4b4b4(T79c0ff3.7f Tff7b72- Te6edf3i Tff7b72* T79c0ff0.02fTb4b4b4)
Tb4b4b4.Te6edf3setChannelUtilizationTb4b4b4(T79c0ff1T79c0ff0f Tff7b72+ Te6edf3i Tff7b72* T79c0ff2Tb4b4b4)
Tb4b4b4.Te6edf3setAirUtilTxTb4b4b4(T79c0ff5f Tff7b72+ Te6edf3iTb4b4b4)
Tb4b4b4.Te6edf3setUptimeSecondsTb4b4b4(T79c0ff3T79c0ff6T79c0ff0T79c0ff0 Tff7b72+ Te6edf3i Tff7b72* T79c0ff3T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}
Te6edf3AppTheme Tb4b4b4{
Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4T79c0ff0T79c0ff0.Te6edf3dpTb4b4b4)Tb4b4b4,
Te6edf3telemetries Tff7b72= Te6edf3telemetriesTb4b4b4,
Te6edf3selectedTime Tff7b72= Te6edf3TimeFrameTb4b4b4.Te6edf3TWENTY_FOUR_HOURSTb4b4b4,
Te6edf3promptInfoDialog Tff7b72= Tb4b4b4{Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}

Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4: Te6edf3TelemetryTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3deviceMetrics Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3deviceMetrics
Tff7b72val Te6edf3time Tff7b72= Te6edf3telemetryTb4b4b4.Te6edf3time Tff7b72* Te6edf3MS_PER_SEC
Te6edf3CardTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(Te6edf3horizontal Tff7b72= T79c0ff8.Te6edf3dpTb4b4b4, Te6edf3vertical Tff7b72= T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3SelectionContainer Tb4b4b4{
Te6edf3ColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3paddingTb4b4b4(T79c0ff8.Te6edf3dpTb4b4b4)Tb4b4b4) Tb4b4b4{
T8b949e/* Time, Battery, and Voltage */
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3DATE_TIME_FORMATTb4b4b4.Te6edf3formatTb4b4b4(Te6edf3timeTb4b4b4)Tb4b4b4,
Te6edf3style Tff7b72= Te6edf3TextStyleTb4b4b4(Te6edf3fontWeight Tff7b72= Te6edf3FontWeightTb4b4b4.Te6edf3BoldTb4b4b4)Tb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)

Te6edf3MaterialBatteryInfoTb4b4b4(Te6edf3level Tff7b72= Te6edf3deviceMetricsTb4b4b4.Te6edf3batteryLevelTb4b4b4, Te6edf3voltage Tff7b72= Te6edf3deviceMetricsTb4b4b4.Te6edf3voltageTb4b4b4)
Tb4b4b4}

Te6edf3SpacerTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3heightTb4b4b4(T79c0ff4.Te6edf3dpTb4b4b4)Tb4b4b4)

T8b949e/* Channel Utilization and Air Utilization Tx */
Te6edf3RowTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4, Te6edf3horizontalArrangement Tff7b72= Te6edf3ArrangementTb4b4b4.Te6edf3SpaceBetweenTb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3text Tff7b72=
Te6edf3stringResourceTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_air_utilTb4b4b4)
Tb4b4b4.Te6edf3formatTb4b4b4(Te6edf3deviceMetricsTb4b4b4.Te6edf3channelUtilizationTb4b4b4, Te6edf3deviceMetricsTb4b4b4.Te6edf3airUtilTxTb4b4b4)
Te6edf3TextTb4b4b4(
Te6edf3text Tff7b72= Te6edf3textTb4b4b4,
Te6edf3color Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3colorSchemeTb4b4b4.Te6edf3onSurfaceTb4b4b4,
Te6edf3fontSize Tff7b72= Te6edf3MaterialThemeTb4b4b4.Te6edf3typographyTb4b4b4.Te6edf3labelLargeTb4b4b4.Te6edf3fontSizeTb4b4b4,
Tb4b4b4)
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4) T8b949e// fake data
Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsCardPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetry Tff7b72=
Te6edf3TelemetryTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setTimeTb4b4b4(Te6edf3nowTb4b4b4)
Tb4b4b4.Te6edf3setDeviceMetricsTb4b4b4(
Te6edf3TelemetryProtosTb4b4b4.Te6edf3DeviceMetricsTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setBatteryLevelTb4b4b4(T79c0ff7T79c0ff5Tb4b4b4)
Tb4b4b4.Te6edf3setVoltageTb4b4b4(T79c0ff3.65fTb4b4b4)
Tb4b4b4.Te6edf3setChannelUtilizationTb4b4b4(T79c0ff2T79c0ff2.5fTb4b4b4)
Tb4b4b4.Te6edf3setAirUtilTxTb4b4b4(T79c0ff1T79c0ff2.0fTb4b4b4)
Tb4b4b4.Te6edf3setUptimeSecondsTb4b4b4(T79c0ff7T79c0ff2T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4,
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Te6edf3AppTheme Tb4b4b4{ Te6edf3DeviceMetricsCardTb4b4b4(Te6edf3telemetry Tff7b72= Te6edf3telemetryTb4b4b4) Tb4b4b4}
Tb4b4b4}

Tf0883e@SuppressTb4b4b4(Ta5d6ff"Ta5d6ffdetekt:MagicNumberTa5d6ff"Tb4b4b4) T8b949e// fake data
Tf0883e@PreviewLightDark
Tf0883e@Composable
Tff7b72private Tff7b72fun Td2a8ffDeviceMetricsScreenPreviewTb4b4b4(Tb4b4b4) Tb4b4b4{
Tff7b72val Te6edf3now Tff7b72= Tb4b4b4(Te6edf3SystemTb4b4b4.Te6edf3currentTimeMillisTb4b4b4(Tb4b4b4) Tff7b72/ T79c0ff1T79c0ff0T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4.Te6edf3toIntTb4b4b4(Tb4b4b4)
Tff7b72val Te6edf3telemetries Tff7b72=
Te6edf3ListTb4b4b4(T79c0ff2T79c0ff4Tb4b4b4) Tb4b4b4{ Te6edf3i Tff7b72-Tff7b72>
Te6edf3TelemetryTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setTimeTb4b4b4(Te6edf3now Tff7b72- Tb4b4b4(T79c0ff2T79c0ff3 Tff7b72- Te6edf3iTb4b4b4) Tff7b72* T79c0ff6T79c0ff0 Tff7b72* T79c0ff6T79c0ff0Tb4b4b4) T8b949e// 1-hour intervals, oldest first
Tb4b4b4.Te6edf3setDeviceMetricsTb4b4b4(
Te6edf3TelemetryProtosTb4b4b4.Te6edf3DeviceMetricsTb4b4b4.Te6edf3newBuilderTb4b4b4(Tb4b4b4)
Tb4b4b4.Te6edf3setBatteryLevelTb4b4b4(T79c0ff8T79c0ff5 Tff7b72- Te6edf3i Tff7b72* T79c0ff2Tb4b4b4) T8b949e// Battery decreases over time
Tb4b4b4.Te6edf3setVoltageTb4b4b4(T79c0ff3.8f Tff7b72- Te6edf3i Tff7b72* T79c0ff0.01fTb4b4b4) T8b949e// Voltage decreases slightly
Tb4b4b4.Te6edf3setChannelUtilizationTb4b4b4(T79c0ff1T79c0ff5f Tff7b72+ Te6edf3i Tff7b72* T79c0ff1.5fTb4b4b4) T8b949e// Channel utilization increases
Tb4b4b4.Te6edf3setAirUtilTxTb4b4b4(T79c0ff8f Tff7b72+ Te6edf3i Tff7b72* T79c0ff0.8fTb4b4b4) T8b949e// Air utilization increases
Tb4b4b4.Te6edf3setUptimeSecondsTb4b4b4(T79c0ff3T79c0ff6T79c0ff0T79c0ff0 Tff7b72+ Te6edf3i Tff7b72* T79c0ff3T79c0ff6T79c0ff0T79c0ff0Tb4b4b4)Tb4b4b4, T8b949e// Uptime increases by 1 hour each
Tb4b4b4)
Tb4b4b4.Te6edf3buildTb4b4b4(Tb4b4b4)
Tb4b4b4}

Te6edf3AppTheme Tb4b4b4{
Te6edf3Surface Tb4b4b4{
Te6edf3Column Tb4b4b4{
Tff7b72var Te6edf3displayInfoDialog Tff7b72by Te6edf3remember Tb4b4b4{ Te6edf3mutableStateOfTb4b4b4(Tff7b72falseTb4b4b4) Tb4b4b4}

Tff7b72if Tb4b4b4(Te6edf3displayInfoDialogTb4b4b4) Tb4b4b4{
Te6edf3LegendInfoDialogTb4b4b4(
Te6edf3pairedRes Tff7b72=
Te6edf3listOfTb4b4b4(
Te6edf3PairTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3channel_utilizationTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3ch_util_definitionTb4b4b4)Tb4b4b4,
Te6edf3PairTb4b4b4(Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_utilizationTb4b4b4, Te6edf3ResTb4b4b4.Te6edf3stringTb4b4b4.Te6edf3air_util_definitionTb4b4b4)Tb4b4b4,
Tb4b4b4)Tb4b4b4,
Te6edf3onDismiss Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72false Tb4b4b4}Tb4b4b4,
Tb4b4b4)
Tb4b4b4}

Te6edf3DeviceMetricsChartTb4b4b4(
Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxWidthTb4b4b4(Tb4b4b4)Tb4b4b4.Te6edf3fillMaxHeightTb4b4b4(Te6edf3fraction Tff7b72= T79c0ff0.33fTb4b4b4)Tb4b4b4,
Te6edf3telemetriesTb4b4b4.Te6edf3reversedTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3TimeFrameTb4b4b4.Te6edf3TWENTY_FOUR_HOURSTb4b4b4,
Te6edf3promptInfoDialog Tff7b72= Tb4b4b4{ Te6edf3displayInfoDialog Tff7b72= Tff7b72true Tb4b4b4}Tb4b4b4,
Tb4b4b4)

Te6edf3SlidingSelectorTb4b4b4(
Te6edf3TimeFrameTb4b4b4.Te6edf3entriesTb4b4b4.Te6edf3toListTb4b4b4(Tb4b4b4)Tb4b4b4,
Te6edf3TimeFrameTb4b4b4.Te6edf3TWENTY_FOUR_HOURSTb4b4b4,
Te6edf3onOptionSelected Tff7b72= Tb4b4b4{ T8b949e/* Preview only */ Tb4b4b4}Tb4b4b4,
Tb4b4b4) Tb4b4b4{
Te6edf3OptionLabelTb4b4b4(Te6edf3stringResourceTb4b4b4(Tffa657itTb4b4b4.Te6edf3strResTb4b4b4)Tb4b4b4)
Tb4b4b4}

T8b949e/* Device Metric Cards */
Te6edf3LazyColumnTb4b4b4(Te6edf3modifier Tff7b72= Te6edf3ModifierTb4b4b4.Te6edf3fillMaxSizeTb4b4b4(Tb4b4b4)Tb4b4b4) Tb4b4b4{
Te6edf3itemsTb4b4b4(Te6edf3telemetriesTb4b4b4) Tb4b4b4{ Te6edf3telemetry Tff7b72-Tff7b72> Te6edf3DeviceMetricsCardTb4b4b4(Te6edf3telemetryTb4b4b4) Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}
Tb4b4b4}

Served by rngit 1.5.0 - Generated in 0.12s